import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Tp3_Constructivo {

	public static void main(String[] args) {
		String nombreArchivo = "Tp3";
		
		String archivoEntrada = ".\\resources\\" + nombreArchivo + ".in";
		String archivoSalida = ".\\resources\\" + nombreArchivo + "Constructivo.out";
		String archivoTiempos = ".\\resources\\" + nombreArchivo + "Constructivo.time";
		
		algoritmo(archivoEntrada, archivoSalida, archivoTiempos);
		
	}
	
	public static void algoritmo(String archivoEntrada, String archivoSalida, String archivoTiempos) {
		FileParser fp = new FileParser(archivoEntrada);
		FileWriter fw = new FileWriter(archivoSalida);
		//FileWriter fwTiempos = new FileWriter(archivoTiempos);
		Set<Integer> res = new HashSet<Integer>();
		
		//int cantidadRepeticiones=5;
		//long minMedicion=0;
		
		while (!fp.getLine().trim().equals("-1")) {
			Grafo instancia = parsearInstancia(fp);
			//for (int rep=0 ;rep<cantidadRepeticiones;rep++) {
				//long tiempoInicio = System.nanoTime();
				res = maxCliqueConstructivo(instancia);
				//long totalTiempo = System.nanoTime()- tiempoInicio;
				//minMedicion+=totalTiempo;
			//}
			//minMedicion /= cantidadRepeticiones;
			//fwTiempos.writeLine("CONSTRUCTIVO;" + instancia.getCantVertices() + ";" + String.valueOf(minMedicion) + ";" + res.size());
			
			fw.writeLine(String.valueOf(res.size()));
			StringBuffer str = new StringBuffer();
			Iterator<Integer> it = res.iterator();
			str.append("N");
			while (it.hasNext()) {
				str.append(" " + it.next());
			}
			fw.writeLine(str.toString());
		}
		
		fw.closeFile();
		fp.closeFile();
		//fwTiempos.closeFile();
	}
	
	public static Grafo parsearInstancia(FileParser fp) {
		String[] str = fp.getLine().trim().replaceAll("\\s+", " ").split("\\s");
		
		Integer cantVertices = Integer.parseInt(str[0]);
		Grafo g = new Grafo(cantVertices);
		
		fp.nextLine();
		
		int cantMaximo = 0;
		int maximo = 1;
		
		int i = 1;
		while (i <= cantVertices) {
			String[] str2 = fp.getLine().trim().replaceAll("\\s+", " ").split("\\s");
			int cantAdyacentes = Integer.parseInt(str2[0]);
			
			if (cantAdyacentes > cantMaximo) {
				cantMaximo = cantAdyacentes;
				maximo = i;
			}
			
			g.setVectorVertices(i, cantAdyacentes);
			
			int j = 1;
			while (j <= cantAdyacentes) {
				g.agregaEje(i, Integer.parseInt(str2[j]));
				j++;
			}
			
			fp.nextLine();
			i++;
		}
		g.setMaximoVertice(maximo);
		g.setVectorGrados();
		
		return g;
	}
	
	public static Set<Integer> maxCliqueConstructivo(Grafo g) {
		Set<Integer> verticesPosibles = new HashSet<Integer>();
		Set<Integer> bolsa = new HashSet<Integer>();
		Set<Integer> vecinosV = new HashSet<Integer>();
		
		int u = g.getVerticeMaximo();
		bolsa.add(u);
		verticesPosibles = g.obtengoVecinos(u);
		
		while (!(verticesPosibles.isEmpty())) {
			int v = g.getVerticeMaximo(verticesPosibles);
			vecinosV = g.obtengoVecinos(v);
			if(vecinosV.containsAll(bolsa)) {
				bolsa.add(v);
			}
			verticesPosibles.remove(v);
		}
		
		return bolsa;
	}
	
}
